# -*- coding: utf-8 -*-
# author: AZJ
# date: 2024/11/6
# 假如命运扼住了你的咽喉，你就去挠她的咯吱窝
import random
# a)用户程序：账号（str：系统随机产生8位数字）、姓名(str)、
# 密码(int:6位数字)、地址、存款余额(int)、开户行（银行的名称（str））
class User:
    def __init__(self, account, name, password, address, balance, bank_name):
        self.account = account
        self.name = name
        self.password = password
        self.address = address
        self.balance = balance
        self.bank_name = bank_name
    def __str__(self):
        return (f"账号：{self.account}, 姓名：{self.name}, 密码：{self.password}, "
                f"地址：{self.address}, 存款余额：{self.balance}, 开户行：{self.bank_name}")

# b)地址程序：国家(str)、省份(str)、街道(str)、门牌号(str)
class Address:
    def __init__(self, country, province, street, house_number):
        self.country = country
        self.province = province
        self.street = street
        self.house_number = house_number

    def __str__(self):
        return (f"国家：{self.country}, 省份：{self.province}, "
                f"街道：{self.street}, 门牌号：{self.house_number}")

# c)银行程序：能存储100个用户的库(字典)、本银行名称（比如：中国工商银行的昌平支行,str）
class Bank:
    def __init__(self, bank_name):
        self.bank_name = bank_name
        self.users = {}

    # 添加用户（传入参数：用户的所有信息。返回值：整型值（1：成功，2：用户已存在，3：用户库已满））
    def add_user(self, user):
        if user.account in self.users:
            return 2
        elif len(self.users) >= 100:
            return 3
        self.users[user.account] = user
        # print(user)
        # print(self.users)
        return 1

    # 存钱（传入值：用户的账号、存取的金额。返回值：布尔类型值）
    def deposit(self, account, amount):
        if account not in self.users:
            return False
        self.users[account].balance += amount
        return True

    # 取钱（传入值：用户的账号，用户密码，取钱金额。返回值：整型值（0：正常，1：账号不存在，2：密码不对，3：钱不够））
    def withdraw(self, account, password, amount):
        # 1.先根据账号信息来查询该用户是否存在，若不存在，则返回代号1，
        if account not in self.users:
            return 1
        # 2. 若存在，则继续判断密码是否正确，若不正确，则返回代号2。
        elif self.users[account].password != password:
            return 2
        # 3. 若账号密码都正确，则继续判断当前用户的金额是否满足要取出的钱，若不满足，则返回代号3
        elif amount > self.users[account].balance:
            return 3
        # 4. 若满足，则将该用户的金额减去。
        else:
            self.users[account].balance -= amount
            return 0

    # 转账（传入值：转出的账号，转入的账号，转出账号的密码，转出的金额。
    # 返回值：0：正常，1：账号不对，2:密码不对，3:钱不够）
    def transfer(self, account, destination,password, amount):
        # 1. 先查询用户库是否存在转出和转入的账号，若不存在则返回代号1
        if account not in self.users or destination not in self.users:
            return 1
        # 2. 若账号都存在则继续判断转出账号的密码是否正确，若不正确，则返回2
        elif self.users[account].password != password:
            return 2
        # 3. 若正确则继续判断要转出的金额是否足够，若不够则返回3
        elif amount > self.users[account].balance:
            return 3
        # 4. 否则正常转出，转出的账号用户金额要相对应的减少，转入的金额相对应的增加。
        else:
            self.users[account].balance -= amount
            self.users[destination].balance += amount
            return 0
    # 查询账户功能（传入值：账号，账号密码，返回值：空）
    def account(self, account, password):
        # 1. 先根据账号判断用户库是否存在该用户，若不存在则打印提示信息：该用户不存在。
        # print(account)
        # print(self.users)
        if account not in self.users:
            print("该用户不存在")
            return
        # 2. 否则继续判断密码是否正确。若不正确则打印相对应的错误信息。
        elif self.users[account].password != password:
            print("密码错误")
            return
        # 3. 若账号和密码都正确，则将该用户的信息都打印出来，比如：当前账号：xxxx,
        # 密码:xxxxxx,余额：xxxx元，用户居住地址：xxxxxxxxxxxxx，当前账户的开户行：xxxxxxxxxx
        else:
            user = self.users[account]
            print(f"账号：{user.account}, 姓名：{user.name}, 密码：{user.password}, "
                  f"地址：{user.address}, 存款余额：{user.balance}, 开户行：{user.bank_name}")
            return

def main(bank):
    print("* * * * * * * * *")
    print("*\t中国工商银行\t*")
    print("*\t账号管理系统\t*")
    print("*\tv1.0.0\t\t*")
    print("* * * * * * * * *")
    # 1.开户、2.存钱、3.取钱、4.转账、5.查询、6.Bye!
    print("*\t1. 开户\t\t*")
    print("*\t2. 存钱\t\t*")
    print("*\t3. 取钱\t\t*")
    print("*\t4. 转账\t\t*")
    print("*\t5. 查询\t\t*")
    print("*\t6. Bye!\t\t*")
    print("* * * * * * * * *")
    choice = input("请选择业务：")
    if choice == '1':
        account = str(random.randint(10000000, 99999999))
        name = input("输入姓名：")
        password = input("输入密码（6位数字）：")
        country = input("输入国家：")
        province = input("输入省份：")
        street = input("输入街道：")
        house_number = input("输入门牌号：")
        address = Address(country, province, street, house_number)
        balance = int(input("输入存款余额："))
        user = User(account, name, password, str(address), balance, bank.bank_name)
        result = bank.add_user(user)
        if result == 1:
            print("用户添加成功, 您的账号为: ", account)
            # print(bank.users)
        elif result == 2:
            print("用户已存在。")
        elif result == 3:
            print("用户库已满。")
    elif choice == '2':
        account = input("输入账号：")
        amount = float(input("输入存款金额："))
        if bank.deposit(account, amount):
            print("存款成功。")
        else:
            print("存款失败。")
    elif choice == '3':
        account = input("输入账号：")
        password = input("输入密码：")
        amount = float(input("输入取款金额："))
        result = bank.withdraw(account, password, amount)
        if result == 0:
            print("取款成功。")
        elif result == 1:
            print("账号不存在。")
        elif result == 2:
            print("密码不对。")
        elif result == 3:
            print("钱不够。")
    elif choice == '4':
        from_account = input("输入转出账号：")
        to_account = input("输入转入账号：")
        password = input("输入转出账号密码：")
        amount = float(input("输入转账金额："))
        result = bank.transfer(from_account, to_account, password, amount)
        if result == 0:
            print("转账成功。")
        elif result == 1:
            print("账号不对。")
        elif result == 2:
            print("密码不对。")
        elif result == 3:
            print("钱不够。")
    elif choice == '5':
        account = input("输入账号：")
        password = input("输入密码：")
        bank.account(account, password)
    elif choice == '6':
        return "q"
    else:
        print("无效的选项，请重新选择。")
        return ""
    return ""


if __name__ == "__main__":
    bank1 = Bank("中国工商银行郑州支行")
    while 1:
        return_value = main(bank1)
        if return_value.upper() == "Q":
            break
